package com.liam.rabbitmqdemo.rabbitmq.simple;

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

/**
 * @Author: LiamLMK
 * @CreateTime: 2025-03-03
 * @Description:
 * @Version: 1.0
 */

public class ProducerDemo {
    public static void main(String[] args) throws IOException, TimeoutException {
        // 1. 建立连接
        ConnectionFactory connectionFactory = new ConnectionFactory();
        connectionFactory.setHost("159.75.83.93");
        connectionFactory.setPort(5672); // 需要提前开放端口号
        connectionFactory.setUsername("study");
        connectionFactory.setPassword("study");
        connectionFactory.setVirtualHost("liam"); // 虚拟主机
        Connection connection = connectionFactory.newConnection();
        // 2. 开启信道
        Channel channel = connection.createChannel();
        // 3. 声明交换机Exchange（使用内置的交换机）
        // 4. 声明队列Queue

    /*
queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete, Map<String, Object> arguments)
    1.queue: 队列名称
    2.durable: 是否持久化.true-设置队列为持久化, 待久化的队列会存盘,服务器重启之后, 消息不丢失。
    3.exclusive:
        * 是否独占, 只能有⼀个消费者监听队列
        * 当Connection关闭时, 是否删除队列
    4.autoDelete: 是否⾃动删除, 当没有Consumer时, ⾃动删除掉
    5.arguments: ⼀些参数
    */
//如果没有⼀个hello_world 这样的⼀个队列, 会⾃动创建, 如果有, 则不创建
        channel.queueDeclare("hello", true, false, false, null);
        // 5. 发送消息
    /*
basicPublish(String exchange, String routingKey, AMQP.BasicProperties props, byte[] body)
    1.exchange: 交换机名称, 简单模式下, 交换机会使⽤默认的""
    2.routingKey: 路由名称, routingKey = 队列名称
    3.props: 配置信息
    4.body: 发送消息的数据
    */
        for (int i = 0; i < 10; i++) {
            String msg = "hello rabbitmq~" + i;
            channel.basicPublish("","hello", null, msg.getBytes());
        }

        System.out.println("消息发送成功");
        // 6. 资源释放
        channel.close();
        connection.close();
    }
}
